package com.biz.primus.ms.price.dao.redis;

import com.biz.primus.base.redis.CrudRedisDao;
import com.biz.primus.ms.price.dao.ro.PriceRo;
import com.google.common.collect.Lists;
import org.springframework.stereotype.Repository;

import java.io.Serializable;
import java.util.List;


/**
 * @author david-liu
 * @date 2017年01月04日
 * @reviewer
 * @see
 */
@Repository
public class PriceRedisDao extends CrudRedisDao<PriceRo, String> implements Serializable {

    private static final long serialVersionUID = -2075462272866208911L;

    public static final String TYPE_A_PRICE_AREA_NO = "PA0CN";

    public PriceRo getTypeAPrice(String productCode) {
        return this.findOne(this.getPriceRoId(productCode, TYPE_A_PRICE_AREA_NO));
    }

    public List<PriceRo> getTypeAPrices(List<String> productCodes) {
        List<String> ids = Lists.newArrayList();
        for (String productCode : productCodes) {
            ids.add(this.getPriceRoId(productCode, TYPE_A_PRICE_AREA_NO));
        }

        return this.findByIdsWithNull(ids);
    }

    public PriceRo getTypeBPrice(String productCode, String areaNo) {
        return this.findOne(this.getPriceRoId(productCode, areaNo));
    }

    /**
     * 通过价格 Id 集合获取价格
     * (价格 ID 为: 商品编码 + 区域编码)
     *
     * @param priceIds 价格 ID 集合
     * @return 价格 Ro 集合
     */
    public List<PriceRo> findByIds(List<String> priceIds) {
        return super.findByIdsWithNull(priceIds);
    }

    /**
     * 获取B类商品的Ro Id
     *
     * @param productCode 商品编码
     * @param areaNo      区域编码
     * @return RO ID
     */
    public String getPriceRoId(String productCode, String areaNo) {
        return String.format("%s%s", productCode, areaNo);
    }

    /**
     * 根据商品中台编码和区域编码获取到价格Ro
     *
     * @param productCode 商品编码
     * @param areaNo      区域编码
     * @return PriceRo 价格Ro
     */
    public PriceRo findPriceRo(String productCode, String areaNo) {
        return findOne(String.format("%s%s", productCode, areaNo));
    }


    public List<PriceRo> getTypeBPrices(List<String> productCodes, String depotCode) {
        List<String> priceIds = Lists.newArrayList();
        for (String productCode:productCodes){
            String priceRoId = this.getPriceRoId(productCode, depotCode);
            priceIds.add(priceRoId);
        }
        List<PriceRo> result = findByIdsWithNull(priceIds);
        return result;
    }
}
